Skip to content

fix(orchestrator): Keep Claude child work on the child thread - #5456

Open
mwolson wants to merge 331 commits into
pingdotgg:t3code/codex-turn-mappingfrom
mwolson:fix/claude-subagent-empty-prompt-message
Open

fix(orchestrator): Keep Claude child work on the child thread#5456
mwolson wants to merge 331 commits into
pingdotgg:t3code/codex-turn-mappingfrom
mwolson:fix/claude-subagent-empty-prompt-message

Conversation

@mwolson

@mwolson mwolson commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

What Changed

A Claude child can keep talking after the parent root settles. Later text, tools, and results were landing on the parent thread, so the child's work showed up in the wrong conversation. Those later frames now stay on the child.

A blank or whitespace Agent prompt, or progress that arrived before the real prompt, opened the child with an empty "Sent by another agent" bubble. The child now waits for real prompt text before showing that opening message. A child that never gets a prompt still runs. It just starts with no blank bubble.

Checked on a live Claude thread. One Agent launched with a single space, another with a real prompt. The blank child had no user message. The sibling had exactly one opening message with the real prompt.

Why

Settle on the parent is not the end of that child's stream. Routing later frames with the parent's turn mixed the two conversations.

The empty bubble was the same class of mistake: the child thread showed a user message that nobody sent.

Review both here. #5388 claude-postsettle-attribution is closed as absorbed.

UI Changes

Child output after the parent settles stays in the child thread on web and mobile. A blank Agent launch no longer creates an empty "Sent by another agent" bubble.

No before/after screenshots.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes

Note

Medium Risk
Touches Claude subagent lifecycle, wake buffering, and tool-result attribution in orchestration-v2; incorrect routing could misplace child-thread events or drop legitimate wake traffic.

Overview
Subagent child threads no longer get an opening “Sent by another agent” user message when the prompt is empty, whitespace-only, or not known yet. A shared hasSubagentPromptText guard is used in the ACP, Codex, Cursor, and Claude adapters; Claude additionally emits that opening message only when prompt text first becomes non-empty (e.g. after task_progress before task_started).

Claude adapter changes tighten how subagents are registered and how wake-buffer frames are handled: registration work is consolidated inside session state updates with an emitPromptMessage flag, wake messages for failed or unknown tasks are dropped earlier (with cleanup on stale task_notifications), and tool results for Agent launches resolve subagents by task id / launch aliases, buffer unresolved launches, and skip results tied to failed wake drains.

A replay fixture and unit tests cover blank prompts and late prompt arrival.

Reviewed by Cursor Bugbot for commit ac5be27. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Keep Claude child work on the child thread, gate empty subagent prompts

  • Adds shared hasSubagentPromptText in SubagentProjection.ts and uses it across ACP, Codex, Cursor, and Claude adapters so blank or whitespace-only prompts no longer emit empty opening user messages or turn items
  • Reworks registerSessionSubagent in ClaudeAdapterV2.ts to preserve prior task state across updates, support reopen semantics (clearing stale results and tool calls), emit the opening prompt at most once, and maintain extra bookkeeping (taskIdByToolUseId, pending resume IDs, terminal item ID sets, generation)
  • Rewrites bufferWakeMessage to attribute wake evidence to known, non-failed subagent or background tasks per native thread, and rewrites the tool_result handling loop to correctly resolve subagents by tool_use_id or task_id, buffer messages for unregistered Agent launches, and skip failed-successor tasks
  • Adds replay fixture claude_subagent_empty_prompt covering a blank prompt, a whitespace-only prompt, and a late-arriving prompt
  • Behavioral Change: subagent opening prompts are now emitted at most once and only when non-whitespace text first becomes available; tool results and wake messages for unknown or failed tasks are now suppressed rather than processed

Macroscope summarized ac5be27.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 7340cd12-4409-4cc1-b8b5-91ab73df863b

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XXL 1,000+ changed lines (additions + deletions). labels Aug 5, 2026
@juliusmarminge
juliusmarminge force-pushed the t3code/codex-turn-mapping branch from 25de21d to 0af2a6e Compare August 7, 2026 12:10
@mwolson
mwolson force-pushed the fix/claude-subagent-empty-prompt-message branch from 0e1b4fe to 1598863 Compare August 8, 2026 18:43
@macroscopeapp

macroscopeapp Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Not approved

Macroscope's review found this PR not approvable — The PR changes production subagent lifecycle, wake/replay, resume attribution, and child-thread projection behavior across multiple adapters. Its stateful Claude changes are broad, and unresolved concerns remain around registry persistence, continuation attribution, reopen handling, and launch-result replay.

You can add or adjust custom eligibility rules. Learn more.

@juliusmarminge
juliusmarminge force-pushed the t3code/codex-turn-mapping branch from 22bd872 to a27c1cc Compare August 10, 2026 17:05
@mwolson
mwolson force-pushed the fix/claude-subagent-empty-prompt-message branch from 1598863 to b5f1b94 Compare August 11, 2026 13:38
@juliusmarminge
juliusmarminge force-pushed the t3code/codex-turn-mapping branch 2 times, most recently from a186d64 to 5b1a115 Compare August 12, 2026 23:19
@mwolson
mwolson force-pushed the fix/claude-subagent-empty-prompt-message branch from b5f1b94 to 9c18ee2 Compare August 13, 2026 21:26
@mwolson mwolson changed the title fix(orchestrator): Skip blank subagent opening messages fix(orchestration): Keep Claude child output attributed after settle Aug 13, 2026
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts Outdated
@juliusmarminge
juliusmarminge force-pushed the t3code/codex-turn-mapping branch 4 times, most recently from 519c42a to 4c55679 Compare August 17, 2026 10:28
@mwolson
mwolson force-pushed the fix/claude-subagent-empty-prompt-message branch 2 times, most recently from ea1bb95 to 4c2c69c Compare August 19, 2026 18:05
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts Outdated
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts Outdated
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts
@t3dotgg t3dotgg added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. and removed vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Aug 24, 2026
@mwolson mwolson changed the title fix(orchestration): Keep Claude child output attributed after settle fix(orchestrator): Keep Claude child work on the child thread Aug 27, 2026
@juliusmarminge
juliusmarminge force-pushed the t3code/codex-turn-mapping branch 4 times, most recently from a110e68 to 81c6ac9 Compare August 29, 2026 00:13
juliusmarminge and others added 18 commits August 31, 2026 21:33
Cancel pending SDK requests before aborting the native session. Preserve per-admission cancellation state and treat stopped initial prompts as interruption instead of provider failure.

Finding: R14 prompt cancellation

Model: GPT-5.6 Sol via Codex
Keep the original cursor owner through ancestor traversal and preserve the history budget across empty intermediate forks. Verify exact paged history against the complete nested projection.

Finding: P01 nested lineage

Model: GPT-5.6 Sol via Codex
Retain pending admission after transient status failures and use one generation-owned retry worker. Ignore stale timers and duplicate evidence so older prompts cannot finish newer steering.

Finding: R14 status reconciliation

Model: GPT-5.6 Sol via Codex
Keep hidden local and inherited rows from consuming history pages. Preserve stop-request dependencies, source-run cutoffs, and imported history while loading related metadata from the selected cohort and using indexed watermark lookups.

Finding: P01 bounded history visibility

Model: GPT-5.6 Sol via Codex
Adapt grouped tool summaries and the floating working timer to V2 run, attempt, and queue state. Bring over the composer, keyboard, and disclosure transitions while retaining the V2 activity inspector and queue controls.

Keep OV2 web composer and grouping behavior intact; share only the existing command label parser with mobile.
Restores main features dropped by the policy replay: pingdotgg#8569 theme wiring,
pingdotgg#8850 composer banner follow-ups, pingdotgg#8855/pingdotgg#8904 composer fixes, pingdotgg#8831
settings search rework, pingdotgg#8803 workspace-mutation refresh (v2-adapted),
pingdotgg#8840 circle-alert, pingdotgg#8584 codex artifact templates, pingdotgg#8688/pingdotgg#8807/pingdotgg#8936
video + image previews (web and mobile, v2-adapted), pingdotgg#8862 Expo glass,
and the round's docs. Timeline thinking rows (pingdotgg#8984) stay on the v2
work-live system.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@juliusmarminge
juliusmarminge force-pushed the t3code/codex-turn-mapping branch from a6e0049 to 50a57b6 Compare September 1, 2026 05:36
juliusmarminge and others added 4 commits September 1, 2026 00:24
The v2 equivalents of main's pingdotgg#8984 and pingdotgg#8922: a "Working for ..." header
anchors the active run, the trailing live tool row survives between
actions in past tense instead of vanishing, and a shimmering Thinking
row marks reasoning gaps. During workspace preparation the header shows
"Setting up worktree..." (driven by the local dispatch flag or the v2
run's preparing status, so remote viewers see it too), the composer
footer span is gone, and draft promotion waits until the run starts or
startup fails instead of navigating mid-preparation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A provider-native subagent could open its child thread with an empty or
whitespace-only user message, which renders as an empty bubble under the
"Sent by another agent" label. The Claude adapter emitted the opening
prompt whenever the subagent was new, and a task_progress frame can
register a subagent before any frame carries its prompt, so the message
was emitted with the "" default and never rewritten when the real prompt
arrived on a later task_started.

A shared hasSubagentPromptText guard now gates every subagent opening
message. The Claude adapter emits it the first time the task prompt
actually has text rather than on first registration, so a late prompt
still opens the child thread exactly once. Codex's existing length check
becomes trim-aware, and Cursor and ACP pick up the same guard.
@mwolson
mwolson force-pushed the fix/claude-subagent-empty-prompt-message branch from ed223fe to ac5be27 Compare September 1, 2026 23:26
@github-actions github-actions Bot added size:L 100-499 changed lines (additions + deletions). and removed size:XXL 1,000+ changed lines (additions + deletions). labels Sep 1, 2026

@cursor cursor Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes using high effort and found 4 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit ac5be27. Configure here.

Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts Outdated
Comment thread apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts
@juliusmarminge
juliusmarminge force-pushed the t3code/codex-turn-mapping branch 3 times, most recently from ceea97b to d2f1f51 Compare September 2, 2026 18:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L 100-499 changed lines (additions + deletions). vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants